package sinfoci.alquimiabtl.notificaciones.actividades;

import java.util.ArrayList;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import sinfoci.alquimiabtl.notificaciones.adaptadores.ItemNotificacionAdapter;
import sinfoci.alquimiabtl.notificaciones.conexion.ConsultasBD;
import sinfoci.alquimiabtl.notificaciones.objetos.DatosTemp;
import sinfoci.alquimiabtl.notificaciones.objetos.Notificacion;
import sinfoci.alquimiabtl.notificaciones.objetos.Usuario;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Esta es la actividad Notificaciones encargada de mostrar la lista de eventos
 * de la ciudad
 * 
 * @author Bryan Camilo Perez Trujillo <br>
 *         AlquimiaBTL - SINFOCI
 * 
 */
public class Notificaciones extends Activity {
	/**
	 * Este atributo representa la lista de eventos
	 */
	private ListView listView;

	/**
	 * Este atributo representa el titulo de la ventana de la actividad
	 */
	private TextView titulo;

	/**
	 * Este es el metodo onCreate el cual se ejecuta al crear la actividad
	 * Notificaciones
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.activity_notificaciones);

		Typeface font = Typeface.createFromAsset(getAssets(),
				"Trebuchet MS.ttf");

		titulo = (TextView) findViewById(R.id.titulo);
		titulo.setTypeface(font);

		listView = (ListView) findViewById(R.id.listaNotificaciones);

		new NotificacionesCiudad().execute();
	}

	/**
	 * Esta tarea asincrona es la encargada de mostrar las notificaciones
	 * dependiendo de la ciudad
	 * 
	 * @author Bryan Camilo Perez Trujillo <br>
	 *         AlquimiaBTL - SINFOCI
	 * 
	 */

	private class NotificacionesCiudad extends
			AsyncTask<Void, List<Notificacion>, Boolean> {
		/**
		 * Este metodo es el encargado de buscar las notificaciones dependiendo
		 * de la ciudad
		 */

		@Override
		protected Boolean doInBackground(Void... params) {
			try {

				JSONArray jsonArray = ConsultasBD
						.consultarNotificacionesPorCiudad(Usuario.instance
								.getCiudad());

				List<Notificacion> notificacionesEncontradas = new ArrayList<Notificacion>();

				if (jsonArray == null || jsonArray.length() == 0) {
					return Boolean.FALSE;
				} else {
					for (int i = 0; i < jsonArray.length(); i++) {

						JSONObject jsonObject = jsonArray.getJSONObject(i);
						Notificacion temp = new Notificacion();

						temp.setIdNotificacion(jsonObject
								.getInt("idNotificacion"));
						temp.setNombre(jsonObject.getString("nombre"));
						temp.setLugar(jsonObject.getString("lugar"));
						temp.setFecha(jsonObject.getString("fecha"));
						temp.setHora(jsonObject.getString("hora"));
						temp.setImagen(jsonObject.getString("imagen"));

						notificacionesEncontradas.add(temp);
					}
				}
				if (notificacionesEncontradas.isEmpty()) {
					return Boolean.FALSE;
				} else {
					publishProgress(notificacionesEncontradas);
				}

			} catch (JSONException e) {
				e.printStackTrace();
				return Boolean.FALSE;
			}
			return Boolean.TRUE;
		}

		/**
		 * Este metodo es encargado de llenar la lista de notificaciones y
		 * mostrar la descripcion detallada de cada notficacion al ser
		 * seleccionada
		 */

		@Override
		protected void onProgressUpdate(List<Notificacion>... values) {
			List<Notificacion> notificaciones = values[0];

			if (notificaciones != null) {
				ItemNotificacionAdapter adapter = new ItemNotificacionAdapter(
						Notificaciones.this, R.layout.list_item_layout,
						notificaciones);
				listView.setAdapter(adapter);
			}

			listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

				public void onItemClick(AdapterView<?> parent, View view,
						int position, long id) {

					Notificacion temp = (Notificacion) parent.getAdapter()
							.getItem(position);

					if (temp != null) {
						try {

							Intent verNotificacion = new Intent(
									getApplicationContext(), Evento.class);
							DatosTemp.getInstance().setNotificacion(temp);
							startActivity(verNotificacion);

						} catch (Exception e) {
							e.printStackTrace();

							Toast.makeText(Notificaciones.this,
									"Error cargando la notificacion",
									Toast.LENGTH_LONG).show();
						}
					}

				}

			});

		}

		/**
		 * Este metodo se invoca al finalizar la tarea asincrona y dependiendo
		 * del resultado de la tarea se muestra el mensaje de que no existen
		 * notificaciones
		 */

		@Override
		protected void onPostExecute(Boolean result) {

			if (!result) {
				Toast.makeText(getApplicationContext(),
						getString(R.string.msjSinEventos), Toast.LENGTH_SHORT)
						.show();
			}
		}
	}

	/**
	 * Este metodo es donde se incluyen las acciones y otras opciones que son
	 * relevantes para el contexto de la actividad Notificaciones
	 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.notificaciones, menu);
		return true;
	}

	/**
	 * Este metodo permite acceder a la actividad de menuApp
	 * 
	 * @param v
	 */
	public void irPrincipal(View v) {
		Intent intent = new Intent(this, MenuApp.class);
		startActivity(intent);
	}

}
